package com.ecloud.common.data.handler;

import java.util.Arrays;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * SpEL处理器 最后一个处理器
 *
 * @author LiuGangQiang Create in 2021/04/30
 */
public class DSExpressionHandler extends DynamicDSHandler {
    /**
     * SpEL解析器
     *
     * @author LiuGangQiang Create in 2021/04/29
     */
    private SpelExpressionParser parser = new SpelExpressionParser();

    /**
     * @see com.ecloud.common.data.handler.DynamicDSHandler#matches(java.lang.String)
     */
    @Override
    public boolean matches(String key) {
        return true;
    }

    /**
     * @see com.ecloud.common.data.handler.DynamicDSHandler#analysis(org.aspectj.lang.JoinPoint, java.lang.String)
     */
    @Override
    public String analysis(JoinPoint point, String spel) {
        /* 获取方法签名 */
        MethodSignature signature = (MethodSignature) point.getSignature();
        String value = null;
        if (spel.startsWith("#")) {
            /* 获取方法的参数名和参数值 */
            List<String> paramNames = Arrays.asList(signature.getParameterNames());
            List<Object> paramValues = Arrays.asList(point.getArgs());
            /* 将方法的参数名和参数值一一对应的放入上下文中 */
            EvaluationContext ctx = new StandardEvaluationContext();
            for (int i = 0; i < paramNames.size(); i++) {
                /* 循环设置参数 */
                ctx.setVariable(paramNames.get(i), paramValues.get(i));
            }
            Object obj = parser.parseExpression(spel).getValue(ctx);
            value = obj == null ? null : obj.toString();
        } else {
            value = spel;
        }
        return value;
    }
}